/*! ****************************************************************************
 * \file Parser.h
 * \brief
 *
 ******************************************************************************/

#ifndef PARSER_H
#define PARSER_H

//==============================================================================
//
//    I N C L U D E S
//
//==============================================================================

#include <string>
#include <map>
#include "Converter.h"

namespace tsc
{
namespace common
{

//==============================================================================
//
//    C L A S S
//
//==============================================================================

class Parser
{
public:
  Parser();
  virtual ~Parser();

  bool isKeyPresent(const std::string& aKey) const;

  //------------------------------------------------------------------------------
  //
  // gets the key value of the required type. If conversion is impossible
  // Converter will throw an exception std::ios_base::failure.
  //
  //------------------------------------------------------------------------------
  template <typename T>
  T getValue(std::string& aKey) throw(std::ios_base::failure)
  {
    if (!isKeyPresent(aKey))
    {
      std::ios_base::failure exc("Parser::getValue() Unable to return Value, Key '" +
                                 aKey + "' does not exist.\n");
      throw exc;
    }

    return Converter::instance()->stringToType<T>(mKeyValMap.find(aKey)->second);
  } // Parser::getValue<T>

protected:
  std::map<std::string, std::string> mKeyValMap;

private:

};

} // namespace common
} // namespace tsc

#endif // PARSER_H
